package bean.dao;

import java.util.List;

import hbt.HibernateUtil;
import org.hibernate.*;

import bean.*;

public class FacturaDAO {
	private static FacturaDAO instancia = null;
	private static SessionFactory sf = null;

	public static FacturaDAO getInstancia(){
		if(instancia == null){
			sf = HibernateUtil.getSessionFactory();
			instancia = new FacturaDAO();
		} 
		return instancia;
	}
	
	/*Facturo solo aquellos pedidos completos (cantidad enviada = cantidad solicitada*/	
	@SuppressWarnings("unchecked")
	public String generarFacturaCliente(String cuil, String formaDePago){
		Factura factura = new Factura();
		Cliente cliente = ClienteDAO.getInstancia().buscarCliente(cuil);
		cliente.getFormasDePago().add(FormaDePagoDAO.getInstancia().buscarFormaDePago(cuil, formaDePago));
		factura.setCliente(cliente);
		factura.setFechaEmision(FechaDAO.getInstancia().getFechaActual());
		factura.setVecimiento(FechaDAO.getInstancia().fechaVencimiento());
		Session session = sf.openSession();
		session.beginTransaction();
		Remito remito = RemitoDAO.getInstancia().buscarRemito(cuil);
		factura.setRemito(remito);
		session.persist(factura);
		Query query = session.createQuery("select iop.cantidadEnviada, iop.producto.idProducto.nroSerie,iop.producto.idProducto.sufijo, ic.precio from Item_Remito ir, Item_OrdenDePedido iop, Item_Cotizacion ic where (ir.remito.numRemito=:numRemito) and (ir.ordenDePedido.numOrden = iop.ordenDePedido.numOrden)and (iop.pendienteDeCompra = false) and (iop.producto.idProducto.nroSerie = ir.producto.idProducto.nroSerie) and (iop.producto.idProducto.sufijo=ir.producto.idProducto.sufijo) and (ic.producto.idProducto.nroSerie = ir.producto.idProducto.nroSerie) and (ic.producto.idProducto.sufijo=ir.producto.idProducto.sufijo))"); 
		query.setParameter("numRemito", remito.getNumRemito());
		List <Object[]> itemsRemito = query.list();
		
		for (int i =0; i<itemsRemito.size();i++){
			Item_Factura item = new Item_Factura();
			item.setCantidad((Integer) itemsRemito.get(i)[0]);
			item.setFactura(factura);
			item.setPrecio( (Float) itemsRemito.get(i)[3]);
			item.setProducto(ProductoDAO.getInstancia().buscarProducto( String.valueOf(itemsRemito.get(i)[1]),String.valueOf(itemsRemito.get(i)[2])));
			factura.getItems().add(item);
			session.persist(item);
		}
				
		session.flush();
		session.getTransaction().commit();
		session.close();
		String facturaXML = XmlDAO.getInstancia().generarFactura(factura);
		return facturaXML;
	}
}
